/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package proyectoi.modelo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

/**
 *
 * @author User
 * 
 */

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

public class Dhondt  extends Observable
        implements Serializable{
    
    private ArrayList<Partido> partidos=new ArrayList();; // son digitados por usuarios
    private Vector divisores= new Vector();
    private ArrayList votosPorCurul = new ArrayList();
    private ArrayList<Integer> cantidadCurules = new ArrayList(); // son digitados por usuarios
    
   
    
    public Dhondt(){
       
    }
    
     @Override
    public void addObserver(Observer v) {
        super.addObserver(v);
        setChanged();
        notifyObservers(null);
    }
    
    public void InicializarVotosPorCurul(){
      for(Partido p: partidos)
            votosPorCurul.add(p.getVotosObtenidos().get(0));
    }
    public void InicializarDivisores(){
         
        for(Partido d: partidos)
               divisores.add(1);
   }

    public void CalculaDhondt(){ // calcula los curules y actualiza la variable de cada partido
        
        for(int i=0; i< cantidadCurules.size(); i++){
           if(i!=0){
            ReasignarVotos(i);
               // crea el siguiente para todos los partidos
               // el primer curul no porq no hace falta,viene desde controlador
           }else{
               InicializarVotosPorCurul();
               InicializarDivisores();
           }
           
          // si es 0 es por el primer curul entonces calcula quien se lo dejo
           for(int j=0; j< partidos.size();j++){
               int gano= (Integer)Collections.max((List)votosPorCurul);
               
              if(partidos.get(j).getVotosObtenidos().get(i).equals(gano)){
                  partidos.get(j).setCurules(1);
                 divisores.set(j, ((Integer)divisores.get(j))+1);
                 //break
              }
           }
         
    }
        setChanged();
        notifyObservers();
    }
    
    
    
   public void ReasignarVotos(Integer pos){
       votosPorCurul.clear(); 
        for(int i=0; i< partidos.size(); i++){
          
           int nVoto= (Integer) partidos.get(i).getVotosObtenidos().get(pos-1)/ (Integer)divisores.get(i);
            partidos.get(i).agregarVoto(nVoto);
            this.votosPorCurul.add(nVoto);
           
          
           
          
       }
    }
    
    public void agregaPartido(Partido partido){
    
        partidos.add(partido);
    }
    
    

    public void agregaNuevoDivisor(int nDivisor){
                divisores.add(nDivisor); 
    }
    
    public void agregarCurul(int cantidad){
        for(int i=0; i<cantidad;i++)
            this.cantidadCurules.add(i);
    }
    
    public void primerosVotos(ArrayList votos){
        
        for(int i=0;i< votos.size();i++){
            partidos.get(i).agregarVoto(i);
        }
    }

    public ArrayList<Partido> getPartidos() {
        return partidos;
    }
    
   

    public void setPartidos(ArrayList<Partido> partidos) {
        this.partidos = partidos;
    }

 
    public ArrayList<Integer> getCantidadCurules() {
        return cantidadCurules;
    }

    public void setCantidadCurules(ArrayList<Integer> cantidadCurules) {
        this.cantidadCurules = cantidadCurules;
    }
    
    
    
    
    
}
